package distribuicaoDeProfessores;



import java.io.File;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import norsys.netica.*;
import norsys.netica.gui.NetPanel;
import norsys.netica.gui.NodePanel;
import norsys.neticaEx.aliases.Node;



/**
 *
 * @author Rhelcris
 * @author Jaime
 * @version 2.0
 */
public class BayesianNetwork {

	private Environ env;
	
	public BayesianNetwork() {
		try {
			this.env = new Environ(null);
			Node.setConstructorClass("norsys.neticaEx.aliases.Node");
		} catch (NeticaException e) {
			e.printStackTrace();
		}
	}
	
    public void buildNet() {
        try {
            //System.out.println("Construindo a rede");

//            Node.setConstructorClass("norsys.neticaEx.aliases.Node");
//            Environ env = new Environ(null);

            Net net = new Net();
            net.setName("HorariosAulas");

            Node prioridade = new Node("Prioridade", "alta,media,baixa,nula", net);
            Node quantidadeDisciplinasAlocadas = new Node("disciplinasAlocadas", "zero,uma,duas,tres", net);
            Node choqueHorario = new Node("choqueHorario", "sim,nao", net);
            Node pegouDisciplinaMediaOuAlta = new Node("PegouDisciplinaMediaOuAlta", "sim,nao", net);
            Node pegarDisciplina = new Node("pegarDisciplina", "sim,nao", net);
            
            pegouDisciplinaMediaOuAlta.visual().setPosition(180, 50);
            prioridade.visual().setPosition(600, 50);
            quantidadeDisciplinasAlocadas.visual().setPosition(100, 250);
            pegarDisciplina.visual().setPosition(380, 250);
            choqueHorario.visual().setPosition(650, 250);

            prioridade.setTitle("Prioridade");
            quantidadeDisciplinasAlocadas.setTitle("Disciplinas Alocadas");
            choqueHorario.setTitle("Choque de Horários");
            pegouDisciplinaMediaOuAlta.setTitle("Pegou Disciplina de Pri. Media ou Alta");
            pegarDisciplina.setTitle("Pegar Disciplina");

            pegarDisciplina.addLink(prioridade);
            pegarDisciplina.addLink(quantidadeDisciplinasAlocadas);
            pegarDisciplina.addLink(choqueHorario);
            pegarDisciplina.addLink(pegouDisciplinaMediaOuAlta);

            float p[] = new float[4];
            p[0] = 0.5f; //Alta
            p[1] = 0.32f; //Media
            p[2] = 0.13f; //Baixa
            p[3] = 0.05f; //Nula
            prioridade.setCPTable(p); // Aqui adicionei prioridade alta = 52%; média = 32% e baixa 15% e nenhuma 1%
            
            float ch[] = new float[2]; ch[0]=0.001f; ch[1] = 0.999f;
            choqueHorario.setCPTable(ch[0], ch[1]); //Sim, não
            
            float pdma[] = new float[2]; pdma[0]=0.37f; pdma[1]=0.63f;
            pegouDisciplinaMediaOuAlta.setCPTable(pdma[0], pdma[1]); // sim, não

            float qd[] = new float[4];
            qd[0] = 0.51f;//Zero
            qd[1] = 0.31f;//uma
            qd[2] = 0.17f;//Duas
            qd[3] = 0.01f;//Tres
            quantidadeDisciplinasAlocadas.setCPTable(qd);
            
            //Nó Já pegou disciplina de média ou alta prioridade
            pegarDisciplina.setCPTable("alta, zero, sim, sim", p[0]*qd[0]*ch[0]*pdma[0], 1-p[0]*qd[0]*ch[0]*pdma[0]);
            pegarDisciplina.setCPTable("alta, zero, nao, sim", p[0]*qd[0]*ch[1]*pdma[0], 1-p[0]*qd[0]*ch[1]*pdma[0]);
            pegarDisciplina.setCPTable("alta, uma, sim, sim", p[0]*qd[1]*ch[0]*pdma[0], 1-p[0]*qd[1]*ch[0]*pdma[0]);
            pegarDisciplina.setCPTable("alta, uma, nao, sim", p[0]*qd[1]*ch[1]*pdma[0], 1-p[0]*qd[1]*ch[1]*pdma[0]);
            pegarDisciplina.setCPTable("alta, duas, sim, sim", p[0]*qd[2]*ch[0]*pdma[0], 1-p[0]*qd[2]*ch[0]*pdma[0]);
            pegarDisciplina.setCPTable("alta, duas, nao, sim", p[0]*qd[2]*ch[1]*pdma[0], 1-p[0]*qd[2]*ch[1]*pdma[0]);
            pegarDisciplina.setCPTable("alta, tres, sim, sim", p[0]*qd[3]*ch[0]*pdma[0], 1-p[0]*qd[3]*ch[0]*pdma[0]);
            pegarDisciplina.setCPTable("alta, tres, nao, sim", p[0]*qd[3]*ch[1]*pdma[0], 1-p[0]*qd[3]*ch[1]*pdma[0]);

            pegarDisciplina.setCPTable("media, zero, sim, sim", p[1]*qd[0]*ch[0]*pdma[0], 1-p[1]*qd[0]*ch[0]*pdma[0]);
            pegarDisciplina.setCPTable("media, zero, nao, sim", p[1]*qd[0]*ch[1]*pdma[0], 1-p[1]*qd[0]*ch[1]*pdma[0]);
            pegarDisciplina.setCPTable("media, uma, sim, sim", p[1]*qd[1]*ch[0]*pdma[0], 1-p[1]*qd[1]*ch[0]*pdma[0]);
            pegarDisciplina.setCPTable("media, uma, nao, sim", p[1]*qd[1]*ch[1]*pdma[0], 1-p[1]*qd[1]*ch[1]*pdma[0]);
            pegarDisciplina.setCPTable("media, duas, sim, sim", p[1]*qd[2]*ch[0]*pdma[0], 1-p[1]*qd[2]*ch[0]*pdma[0]);
            pegarDisciplina.setCPTable("media, duas, nao, sim", p[1]*qd[2]*ch[1]*pdma[0], 1-p[1]*qd[2]*ch[1]*pdma[0]);
            pegarDisciplina.setCPTable("media, tres, sim, sim", p[1]*qd[3]*ch[0]*pdma[0], 1-p[1]*qd[3]*ch[0]*pdma[0]);
            pegarDisciplina.setCPTable("media, tres, nao, sim", p[1]*qd[3]*ch[1]*pdma[0], 1-p[1]*qd[3]*ch[1]*pdma[0]);

            pegarDisciplina.setCPTable("baixa, zero, sim, sim", p[2]*qd[0]*ch[0]*pdma[0], 1-p[2]*qd[0]*ch[0]*pdma[0]);
            pegarDisciplina.setCPTable("baixa, zero, nao, sim", p[2]*qd[0]*ch[1]*pdma[0], 1-p[2]*qd[0]*ch[1]*pdma[0]);
            pegarDisciplina.setCPTable("baixa, uma, sim, sim", p[2]*qd[1]*ch[0]*pdma[0], 1-p[2]*qd[1]*ch[0]*pdma[0]);
            pegarDisciplina.setCPTable("baixa, uma, nao, sim", p[2]*qd[1]*ch[1]*pdma[0], 1-p[2]*qd[1]*ch[1]*pdma[0]);
            pegarDisciplina.setCPTable("baixa, duas, sim, sim", p[2]*qd[2]*ch[0]*pdma[0], 1-p[2]*qd[2]*ch[0]*pdma[0]);
            pegarDisciplina.setCPTable("baixa, duas, nao, sim", p[2]*qd[2]*ch[1]*pdma[0], 1-p[2]*qd[2]*ch[1]*pdma[0]);
            pegarDisciplina.setCPTable("baixa, tres, sim, sim", p[2]*qd[3]*ch[0]*pdma[0], 1-p[2]*qd[3]*ch[0]*pdma[0]);
            pegarDisciplina.setCPTable("baixa, tres, nao, sim", p[2]*qd[3]*ch[1]*pdma[0], 1-p[2]*qd[3]*ch[1]*pdma[0]);

            pegarDisciplina.setCPTable("nula, zero, sim, sim", p[3]*qd[0]*ch[0]*pdma[0], 1-p[3]*qd[0]*ch[0]*pdma[0]);
            pegarDisciplina.setCPTable("nula, zero, nao, sim", p[3]*qd[0]*ch[1]*pdma[0], 1-p[3]*qd[0]*ch[1]*pdma[0]);
            pegarDisciplina.setCPTable("nula, uma, sim, sim", p[3]*qd[1]*ch[0]*pdma[0], 1-p[3]*qd[1]*ch[0]*pdma[0]);
            pegarDisciplina.setCPTable("nula, uma, nao, sim", p[3]*qd[1]*ch[1]*pdma[0], 1-p[3]*qd[1]*ch[1]*pdma[0]);
            pegarDisciplina.setCPTable("nula, duas, sim, sim", p[3]*qd[2]*ch[0]*pdma[0], 1-p[3]*qd[2]*ch[0]*pdma[0]);
            pegarDisciplina.setCPTable("nula, duas, nao, sim", p[3]*qd[2]*ch[1]*pdma[0], 1-p[3]*qd[2]*ch[1]*pdma[0]);
            pegarDisciplina.setCPTable("nula, tres, sim, sim", p[3]*qd[3]*ch[0]*pdma[0], 1-p[3]*qd[3]*ch[0]*pdma[0]);
            pegarDisciplina.setCPTable("nula, tres, nao, sim", p[3]*qd[3]*ch[1]*pdma[0], 1-p[3]*qd[3]*ch[1]*pdma[0]);

            
            //Nó não pegou disciplina de média ou Alta prioridade
            pegarDisciplina.setCPTable("alta, zero, sim, nao", p[0]*qd[0]*ch[0]*pdma[1], 1-p[0]*qd[0]*ch[0]*pdma[1]);
            pegarDisciplina.setCPTable("alta, zero, nao, nao", p[0]*qd[0]*ch[1]*pdma[1], 1-p[0]*qd[0]*ch[1]*pdma[1]);
            pegarDisciplina.setCPTable("alta, uma, sim, nao", p[0]*qd[1]*ch[0]*pdma[1], 1-p[0]*qd[1]*ch[0]*pdma[1]);
            pegarDisciplina.setCPTable("alta, uma, nao, nao", p[0]*qd[1]*ch[1]*pdma[1], 1-p[0]*qd[1]*ch[1]*pdma[1]);
            pegarDisciplina.setCPTable("alta, duas, sim, nao", p[0]*qd[2]*ch[0]*pdma[1], 1-p[0]*qd[2]*ch[0]*pdma[1]);
            pegarDisciplina.setCPTable("alta, duas, nao, nao", p[0]*qd[2]*ch[1]*pdma[1], 1-p[0]*qd[2]*ch[1]*pdma[1]);
            pegarDisciplina.setCPTable("alta, tres, sim, nao", p[0]*qd[3]*ch[0]*pdma[1], 1-p[0]*qd[3]*ch[0]*pdma[1]);
            pegarDisciplina.setCPTable("alta, tres, nao, nao", p[0]*qd[3]*ch[1]*pdma[1], 1-p[0]*qd[3]*ch[1]*pdma[1]);

            pegarDisciplina.setCPTable("media, zero, sim, nao", p[1]*qd[0]*ch[0]*pdma[1], 1-p[1]*qd[0]*ch[0]*pdma[1]);
            pegarDisciplina.setCPTable("media, zero, nao, nao", p[1]*qd[0]*ch[1]*pdma[1], 1-p[1]*qd[0]*ch[1]*pdma[1]);
            pegarDisciplina.setCPTable("media, uma, sim, nao", p[1]*qd[1]*ch[0]*pdma[1], 1-p[1]*qd[1]*ch[0]*pdma[1]);
            pegarDisciplina.setCPTable("media, uma, nao, nao", p[1]*qd[1]*ch[1]*pdma[1], 1-p[1]*qd[1]*ch[1]*pdma[1]);
            pegarDisciplina.setCPTable("media, duas, sim, nao", p[1]*qd[2]*ch[0]*pdma[1], 1-p[1]*qd[2]*ch[0]*pdma[1]);
            pegarDisciplina.setCPTable("media, duas, nao, nao", p[1]*qd[2]*ch[1]*pdma[1], 1-p[1]*qd[2]*ch[1]*pdma[1]);
            pegarDisciplina.setCPTable("media, tres, sim, nao", p[1]*qd[3]*ch[0]*pdma[1], 1-p[1]*qd[3]*ch[0]*pdma[1]);
            pegarDisciplina.setCPTable("media, tres, nao, nao", p[1]*qd[3]*ch[1]*pdma[1], 1-p[1]*qd[3]*ch[1]*pdma[1]);

            pegarDisciplina.setCPTable("baixa, zero, sim, nao", p[2]*qd[0]*ch[0]*pdma[1], 1-p[2]*qd[0]*ch[0]*pdma[1]);
            pegarDisciplina.setCPTable("baixa, zero, nao, nao", p[2]*qd[0]*ch[1]*pdma[1], 1-p[2]*qd[0]*ch[1]*pdma[1]);
            pegarDisciplina.setCPTable("baixa, uma, sim, nao", p[2]*qd[1]*ch[0]*pdma[1], 1-p[2]*qd[1]*ch[0]*pdma[1]);
            pegarDisciplina.setCPTable("baixa, uma, nao, nao", p[2]*qd[1]*ch[1]*pdma[1], 1-p[2]*qd[1]*ch[1]*pdma[1]);
            pegarDisciplina.setCPTable("baixa, duas, sim, nao", p[2]*qd[2]*ch[0]*pdma[1], 1-p[2]*qd[2]*ch[0]*pdma[1]);
            pegarDisciplina.setCPTable("baixa, duas, nao, nao", p[2]*qd[2]*ch[1]*pdma[1], 1-p[2]*qd[2]*ch[1]*pdma[1]);
            pegarDisciplina.setCPTable("baixa, tres, sim, nao", p[2]*qd[3]*ch[0]*pdma[1], 1-p[2]*qd[3]*ch[0]*pdma[1]);
            pegarDisciplina.setCPTable("baixa, tres, nao, nao", p[2]*qd[3]*ch[1]*pdma[1], 1-p[2]*qd[3]*ch[1]*pdma[1]);

            pegarDisciplina.setCPTable("nula, zero, sim, nao", p[3]*qd[0]*ch[0]*pdma[1], 1-p[3]*qd[0]*ch[0]*pdma[1]);
            pegarDisciplina.setCPTable("nula, zero, nao, nao", p[3]*qd[0]*ch[1]*pdma[1], 1-p[3]*qd[0]*ch[1]*pdma[1]);
            pegarDisciplina.setCPTable("nula, uma, sim, nao", p[3]*qd[1]*ch[0]*pdma[1], 1-p[3]*qd[1]*ch[0]*pdma[1]);
            pegarDisciplina.setCPTable("nula, uma, nao, nao", p[3]*qd[1]*ch[1]*pdma[1], 1-p[3]*qd[1]*ch[1]*pdma[1]);
            pegarDisciplina.setCPTable("nula, duas, sim, nao", p[3]*qd[2]*ch[0]*pdma[1], 1-p[3]*qd[2]*ch[0]*pdma[1]);
            pegarDisciplina.setCPTable("nula, duas, nao, nao", p[3]*qd[2]*ch[1]*pdma[1], 1-p[3]*qd[2]*ch[1]*pdma[1]);
            pegarDisciplina.setCPTable("nula, tres, sim, nao", p[3]*qd[3]*ch[0]*pdma[1], 1-p[3]*qd[3]*ch[0]*pdma[1]);
            pegarDisciplina.setCPTable("nula, tres, nao, nao", p[3]*qd[3]*ch[1]*pdma[1], 1-p[3]*qd[3]*ch[1]*pdma[1]);
            
            //Criando e salvando um arquivo com a RedeBayesiana
            Streamer stream = new Streamer("DistribuicaoHorarios.dne");
            net.write(stream);

            net.finalize(); // free resources immediately and safely; not
            // strictly necessary, but a good habit
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    
     public void buildNetParte2() {
        try {
            //System.out.println("Construindo a rede parte 2");

            Net net = new Net();
            net.setName("Atividades");

            Node cargaHorariaDisponivel = new Node("cargaHorariaDisponivel", "sim, nao", net);
            Node afinidadeAtividade     = new Node("afinidadeAtividade", "afinidadeAlta, afinidadeMedia, afinidadeBaixa", net);
            Node cargaHorariaAlocada    = new Node("cargaHorariaAlocada", "intervalo1, intervalo2, intervalo3, intervalo4", net);
            Node pontuacaoProfessor     = new Node("pontuacaoProfessor", "pontuacaoBaixa, pontuacaoMedia, pontuacaoAlta", net);
            Node pegarAtividade			= new Node("pegarAtividade", "pega, naoPega", net);

            cargaHorariaDisponivel.visual().setPosition(380, 50);
            afinidadeAtividade.visual().setPosition(100, 200);
            pegarAtividade.visual().setPosition(380, 200);
            pontuacaoProfessor.visual().setPosition(650, 200);
            cargaHorariaAlocada.visual().setPosition(450, 360);

            cargaHorariaDisponivel.setTitle("Carga Horária Disponivel");
            afinidadeAtividade.setTitle("afinidade com Atividade");
            cargaHorariaAlocada.setTitle("Carga Horaria Alocada");
            pontuacaoProfessor.setTitle("Pontuacao Professor");
            pegarAtividade.setTitle("Pegar Atividade");
            
            pegarAtividade.addLink(cargaHorariaAlocada);
            pegarAtividade.addLink(afinidadeAtividade);
            pegarAtividade.addLink(pontuacaoProfessor);
            pegarAtividade.addLink(cargaHorariaDisponivel);
            
            float chd[] = new float[2]; chd[0]=0.999f; chd[1]=0.001f;
            cargaHorariaDisponivel.setCPTable(chd[0], chd[1]);//sim, não
            
            float afa[] = {0.48f, 0.34f, 0.18f}; //Alta, media, baixa
            afinidadeAtividade.setCPTable(afa[0], afa[1], afa[2]);     
            
            float pprof[] = {0.6f, 0.3f, 0.1f}; //pontuaçãoBaixa, pontuaçãoMedia, pontuaçãoAlta
            pontuacaoProfessor.setCPTable(pprof[0], pprof[1], pprof[2]);
            
            float ch[] = new float[4];
            ch[0] = 0.5f; //até 20 hs
            ch[1] = 0.3f; //de 21 a 29
            ch[2] = 0.15f;//30 a 25
            ch[3] = 0.05f;// >35
            cargaHorariaAlocada.setCPTable(ch);
            
            //ch, afa, ppfrof, chd
            // Intervalo 1 - até 20 hs  
            pegarAtividade.setCPTable("intervalo1, afinidadeAlta, pontuacaoBaixa, sim",  ch[0]*afa[0]*pprof[0]*chd[0], 1-ch[0]*afa[0]*pprof[0]*chd[0]);
            pegarAtividade.setCPTable("intervalo1, afinidadeAlta, pontuacaoBaixa, nao",  ch[0]*afa[0]*pprof[0]*chd[1], 1-ch[0]*afa[0]*pprof[0]*chd[1]);
            pegarAtividade.setCPTable("intervalo1, afinidadeAlta, pontuacaoMedia, sim",  ch[0]*afa[0]*pprof[1]*chd[0], 1-ch[0]*afa[0]*pprof[1]*chd[0]);
            pegarAtividade.setCPTable("intervalo1, afinidadeAlta, pontuacaoMedia, nao",  ch[0]*afa[0]*pprof[1]*chd[1], 1-ch[0]*afa[0]*pprof[1]*chd[1]);
            pegarAtividade.setCPTable("intervalo1, afinidadeAlta, pontuacaoAlta, sim",  ch[0]*afa[0]*pprof[2]*chd[0], 1-ch[0]*afa[0]*pprof[2]*chd[0]);
            pegarAtividade.setCPTable("intervalo1, afinidadeAlta, pontuacaoAlta, nao",  ch[0]*afa[0]*pprof[2]*chd[1], 1-ch[0]*afa[0]*pprof[2]*chd[1]);
            
            pegarAtividade.setCPTable("intervalo1, afinidadeMedia, pontuacaoBaixa, sim",  ch[0]*afa[1]*pprof[0]*chd[0], 1-ch[0]*afa[1]*pprof[0]*chd[0]);
            pegarAtividade.setCPTable("intervalo1, afinidadeMedia, pontuacaoBaixa, nao",  ch[0]*afa[1]*pprof[0]*chd[1], 1-ch[0]*afa[1]*pprof[0]*chd[1]);
            pegarAtividade.setCPTable("intervalo1, afinidadeMedia, pontuacaoMedia, sim",  ch[0]*afa[1]*pprof[1]*chd[0], 1-ch[0]*afa[1]*pprof[1]*chd[0]);
            pegarAtividade.setCPTable("intervalo1, afinidadeMedia, pontuacaoMedia, nao",  ch[0]*afa[1]*pprof[1]*chd[1], 1-ch[0]*afa[1]*pprof[1]*chd[1]);
            pegarAtividade.setCPTable("intervalo1, afinidadeMedia, pontuacaoAlta, sim",  ch[0]*afa[1]*pprof[2]*chd[0], 1-ch[0]*afa[1]*pprof[2]*chd[0]);
            pegarAtividade.setCPTable("intervalo1, afinidadeMedia, pontuacaoAlta, nao",  ch[0]*afa[1]*pprof[2]*chd[1], 1-ch[0]*afa[1]*pprof[2]*chd[1]);
            
            pegarAtividade.setCPTable("intervalo1, afinidadeBaixa, pontuacaoBaixa, sim",  ch[0]*afa[2]*pprof[0]*chd[0], 1-ch[0]*afa[2]*pprof[0]*chd[0]);
            pegarAtividade.setCPTable("intervalo1, afinidadeBaixa, pontuacaoBaixa, nao",  ch[0]*afa[2]*pprof[0]*chd[1], 1-ch[0]*afa[2]*pprof[0]*chd[1]);
            pegarAtividade.setCPTable("intervalo1, afinidadeBaixa, pontuacaoMedia, sim",  ch[0]*afa[2]*pprof[1]*chd[0], 1-ch[0]*afa[2]*pprof[1]*chd[0]);
            pegarAtividade.setCPTable("intervalo1, afinidadeBaixa, pontuacaoMedia, nao",  ch[0]*afa[2]*pprof[1]*chd[1], 1-ch[0]*afa[2]*pprof[1]*chd[1]);
            pegarAtividade.setCPTable("intervalo1, afinidadeBaixa, pontuacaoAlta, sim",  ch[0]*afa[2]*pprof[2]*chd[0], 1-ch[0]*afa[2]*pprof[2]*chd[0]);
            pegarAtividade.setCPTable("intervalo1, afinidadeBaixa, pontuacaoAlta, nao",  ch[0]*afa[2]*pprof[2]*chd[1], 1-ch[0]*afa[2]*pprof[2]*chd[1]);
            
            
            // Intervalo 2 - 21 a 29
            pegarAtividade.setCPTable("intervalo2, afinidadeAlta, pontuacaoBaixa, sim",  ch[1]*afa[0]*pprof[0]*chd[0], 1-ch[1]*afa[0]*pprof[0]*chd[0]);
            pegarAtividade.setCPTable("intervalo2, afinidadeAlta, pontuacaoBaixa, nao",  ch[1]*afa[0]*pprof[0]*chd[1], 1-ch[1]*afa[0]*pprof[0]*chd[1]);
            pegarAtividade.setCPTable("intervalo2, afinidadeAlta, pontuacaoMedia, sim",  ch[1]*afa[0]*pprof[1]*chd[0], 1-ch[1]*afa[0]*pprof[1]*chd[0]);
            pegarAtividade.setCPTable("intervalo2, afinidadeAlta, pontuacaoMedia, nao",  ch[1]*afa[0]*pprof[1]*chd[1], 1-ch[1]*afa[0]*pprof[1]*chd[1]);
            pegarAtividade.setCPTable("intervalo2, afinidadeAlta, pontuacaoAlta, sim",  ch[1]*afa[0]*pprof[2]*chd[0], 1-ch[1]*afa[0]*pprof[2]*chd[0]);
            pegarAtividade.setCPTable("intervalo2, afinidadeAlta, pontuacaoAlta, nao",  ch[1]*afa[0]*pprof[2]*chd[1], 1-ch[1]*afa[0]*pprof[2]*chd[1]);
            
            pegarAtividade.setCPTable("intervalo2, afinidadeMedia, pontuacaoBaixa, sim",  ch[1]*afa[1]*pprof[0]*chd[0], 1-ch[1]*afa[1]*pprof[0]*chd[0]);
            pegarAtividade.setCPTable("intervalo2, afinidadeMedia, pontuacaoBaixa, nao",  ch[1]*afa[1]*pprof[0]*chd[1], 1-ch[1]*afa[1]*pprof[0]*chd[1]);
            pegarAtividade.setCPTable("intervalo2, afinidadeMedia, pontuacaoMedia, sim",  ch[1]*afa[1]*pprof[1]*chd[0], 1-ch[1]*afa[1]*pprof[1]*chd[0]);
            pegarAtividade.setCPTable("intervalo2, afinidadeMedia, pontuacaoMedia, nao",  ch[1]*afa[1]*pprof[1]*chd[1], 1-ch[1]*afa[1]*pprof[1]*chd[1]);
            pegarAtividade.setCPTable("intervalo2, afinidadeMedia, pontuacaoAlta, sim",  ch[1]*afa[1]*pprof[2]*chd[0], 1-ch[1]*afa[1]*pprof[2]*chd[0]);
            pegarAtividade.setCPTable("intervalo2, afinidadeMedia, pontuacaoAlta, nao",  ch[1]*afa[1]*pprof[2]*chd[1], 1-ch[1]*afa[1]*pprof[2]*chd[1]);
            
            pegarAtividade.setCPTable("intervalo2, afinidadeBaixa, pontuacaoBaixa, sim",  ch[1]*afa[2]*pprof[0]*chd[0], 1-ch[1]*afa[2]*pprof[0]*chd[0]);
            pegarAtividade.setCPTable("intervalo2, afinidadeBaixa, pontuacaoBaixa, nao",  ch[1]*afa[2]*pprof[0]*chd[1], 1-ch[1]*afa[2]*pprof[0]*chd[1]);
            pegarAtividade.setCPTable("intervalo2, afinidadeBaixa, pontuacaoMedia, sim",  ch[1]*afa[2]*pprof[1]*chd[0], 1-ch[1]*afa[2]*pprof[1]*chd[0]);
            pegarAtividade.setCPTable("intervalo2, afinidadeBaixa, pontuacaoMedia, nao",  ch[1]*afa[2]*pprof[1]*chd[1], 1-ch[1]*afa[2]*pprof[1]*chd[1]);
            pegarAtividade.setCPTable("intervalo2, afinidadeBaixa, pontuacaoAlta, sim",  ch[1]*afa[2]*pprof[2]*chd[0], 1-ch[1]*afa[2]*pprof[2]*chd[0]);
            pegarAtividade.setCPTable("intervalo2, afinidadeBaixa, pontuacaoAlta, nao",  ch[1]*afa[2]*pprof[2]*chd[1], 1-ch[1]*afa[2]*pprof[2]*chd[1]);

            
            // Intervalo 3 - 30 a 35
            pegarAtividade.setCPTable("intervalo3, afinidadeAlta, pontuacaoBaixa, sim",  ch[2]*afa[0]*pprof[0]*chd[0], 1-ch[2]*afa[0]*pprof[0]*chd[0]);
            pegarAtividade.setCPTable("intervalo3, afinidadeAlta, pontuacaoBaixa, nao",  ch[2]*afa[0]*pprof[0]*chd[1], 1-ch[2]*afa[0]*pprof[0]*chd[1]);
            pegarAtividade.setCPTable("intervalo3, afinidadeAlta, pontuacaoMedia, sim",  ch[2]*afa[0]*pprof[1]*chd[0], 1-ch[2]*afa[0]*pprof[1]*chd[0]);
            pegarAtividade.setCPTable("intervalo3, afinidadeAlta, pontuacaoMedia, nao",  ch[2]*afa[0]*pprof[1]*chd[1], 1-ch[2]*afa[0]*pprof[1]*chd[1]);
            pegarAtividade.setCPTable("intervalo3, afinidadeAlta, pontuacaoAlta, sim",  ch[2]*afa[0]*pprof[2]*chd[0], 1-ch[2]*afa[0]*pprof[2]*chd[0]);
            pegarAtividade.setCPTable("intervalo3, afinidadeAlta, pontuacaoAlta, nao",  ch[2]*afa[0]*pprof[2]*chd[1], 1-ch[2]*afa[0]*pprof[2]*chd[1]);
            
            pegarAtividade.setCPTable("intervalo3, afinidadeMedia, pontuacaoBaixa, sim",  ch[2]*afa[1]*pprof[0]*chd[0], 1-ch[2]*afa[1]*pprof[0]*chd[0]);
            pegarAtividade.setCPTable("intervalo3, afinidadeMedia, pontuacaoBaixa, nao",  ch[2]*afa[1]*pprof[0]*chd[1], 1-ch[2]*afa[1]*pprof[0]*chd[1]);
            pegarAtividade.setCPTable("intervalo3, afinidadeMedia, pontuacaoMedia, sim",  ch[2]*afa[1]*pprof[1]*chd[0], 1-ch[2]*afa[1]*pprof[1]*chd[0]);
            pegarAtividade.setCPTable("intervalo3, afinidadeMedia, pontuacaoMedia, nao",  ch[2]*afa[1]*pprof[1]*chd[1], 1-ch[2]*afa[1]*pprof[1]*chd[1]);
            pegarAtividade.setCPTable("intervalo3, afinidadeMedia, pontuacaoAlta, sim",  ch[2]*afa[1]*pprof[2]*chd[0], 1-ch[2]*afa[1]*pprof[2]*chd[0]);
            pegarAtividade.setCPTable("intervalo3, afinidadeMedia, pontuacaoAlta, nao",  ch[2]*afa[1]*pprof[2]*chd[1], 1-ch[2]*afa[1]*pprof[2]*chd[1]);
            
            pegarAtividade.setCPTable("intervalo3, afinidadeBaixa, pontuacaoBaixa, sim",  ch[2]*afa[2]*pprof[0]*chd[0], 1-ch[2]*afa[2]*pprof[0]*chd[0]);
            pegarAtividade.setCPTable("intervalo3, afinidadeBaixa, pontuacaoBaixa, nao",  ch[2]*afa[2]*pprof[0]*chd[1], 1-ch[2]*afa[2]*pprof[0]*chd[1]);
            pegarAtividade.setCPTable("intervalo3, afinidadeBaixa, pontuacaoMedia, sim",  ch[2]*afa[2]*pprof[1]*chd[0], 1-ch[2]*afa[2]*pprof[1]*chd[0]);
            pegarAtividade.setCPTable("intervalo3, afinidadeBaixa, pontuacaoMedia, nao",  ch[2]*afa[2]*pprof[1]*chd[1], 1-ch[2]*afa[2]*pprof[1]*chd[1]);
            pegarAtividade.setCPTable("intervalo3, afinidadeBaixa, pontuacaoAlta, sim",  ch[2]*afa[2]*pprof[2]*chd[0], 1-ch[2]*afa[2]*pprof[2]*chd[0]);
            pegarAtividade.setCPTable("intervalo3, afinidadeBaixa, pontuacaoAlta, nao",  ch[2]*afa[2]*pprof[2]*chd[1], 1-ch[2]*afa[2]*pprof[2]*chd[1]);
            
            
            // Intervalo 4 - maior que 35
            pegarAtividade.setCPTable("intervalo4, afinidadeAlta, pontuacaoBaixa, sim",  ch[3]*afa[0]*pprof[0]*chd[0], 1-ch[3]*afa[0]*pprof[0]*chd[0]);
            pegarAtividade.setCPTable("intervalo4, afinidadeAlta, pontuacaoBaixa, nao",  ch[3]*afa[0]*pprof[0]*chd[1], 1-ch[3]*afa[0]*pprof[0]*chd[1]);
            pegarAtividade.setCPTable("intervalo4, afinidadeAlta, pontuacaoMedia, sim",  ch[3]*afa[0]*pprof[1]*chd[0], 1-ch[3]*afa[0]*pprof[1]*chd[0]);
            pegarAtividade.setCPTable("intervalo4, afinidadeAlta, pontuacaoMedia, nao",  ch[3]*afa[0]*pprof[1]*chd[1], 1-ch[3]*afa[0]*pprof[1]*chd[1]);
            pegarAtividade.setCPTable("intervalo4, afinidadeAlta, pontuacaoAlta, sim",  ch[3]*afa[0]*pprof[2]*chd[0], 1-ch[3]*afa[0]*pprof[2]*chd[0]);
            pegarAtividade.setCPTable("intervalo4, afinidadeAlta, pontuacaoAlta, nao",  ch[3]*afa[0]*pprof[2]*chd[1], 1-ch[3]*afa[0]*pprof[2]*chd[1]);
            
            pegarAtividade.setCPTable("intervalo4, afinidadeMedia, pontuacaoBaixa, sim",  ch[3]*afa[1]*pprof[0]*chd[0], 1-ch[3]*afa[1]*pprof[0]*chd[0]);
            pegarAtividade.setCPTable("intervalo4, afinidadeMedia, pontuacaoBaixa, nao",  ch[3]*afa[1]*pprof[0]*chd[1], 1-ch[3]*afa[1]*pprof[0]*chd[1]);
            pegarAtividade.setCPTable("intervalo4, afinidadeMedia, pontuacaoMedia, sim",  ch[3]*afa[1]*pprof[1]*chd[0], 1-ch[3]*afa[1]*pprof[1]*chd[0]);
            pegarAtividade.setCPTable("intervalo4, afinidadeMedia, pontuacaoMedia, nao",  ch[3]*afa[1]*pprof[1]*chd[1], 1-ch[3]*afa[1]*pprof[1]*chd[1]);
            pegarAtividade.setCPTable("intervalo4, afinidadeMedia, pontuacaoAlta, sim",  ch[3]*afa[1]*pprof[2]*chd[0], 1-ch[3]*afa[1]*pprof[2]*chd[0]);
            pegarAtividade.setCPTable("intervalo4, afinidadeMedia, pontuacaoAlta, nao",  ch[3]*afa[1]*pprof[2]*chd[1], 1-ch[3]*afa[1]*pprof[2]*chd[1]);
            
            pegarAtividade.setCPTable("intervalo4, afinidadeBaixa, pontuacaoBaixa, sim",  ch[3]*afa[2]*pprof[0]*chd[0], 1-ch[3]*afa[2]*pprof[0]*chd[0]);
            pegarAtividade.setCPTable("intervalo4, afinidadeBaixa, pontuacaoBaixa, nao",  ch[3]*afa[2]*pprof[0]*chd[1], 1-ch[3]*afa[2]*pprof[0]*chd[1]);
            pegarAtividade.setCPTable("intervalo4, afinidadeBaixa, pontuacaoMedia, sim",  ch[3]*afa[2]*pprof[1]*chd[0], 1-ch[3]*afa[2]*pprof[1]*chd[0]);
            pegarAtividade.setCPTable("intervalo4, afinidadeBaixa, pontuacaoMedia, nao",  ch[3]*afa[2]*pprof[1]*chd[1], 1-ch[3]*afa[2]*pprof[1]*chd[1]);
            pegarAtividade.setCPTable("intervalo4, afinidadeBaixa, pontuacaoAlta, sim",  ch[3]*afa[2]*pprof[2]*chd[0], 1-ch[3]*afa[2]*pprof[2]*chd[0]);
            pegarAtividade.setCPTable("intervalo4, afinidadeBaixa, pontuacaoAlta, nao",  ch[3]*afa[2]*pprof[2]*chd[1], 1-ch[3]*afa[2]*pprof[2]*chd[1]);

            Streamer stream = new Streamer("DistribuicaoAtividades.dne");
            net.write(stream);

            net.finalize(); // free resources immediately and safely; not
            // strictly necessary, but a good habit
        } catch (Exception e) {
            e.printStackTrace();
        }
    	
    }

    public void desenhaRede(String nome) {
        try {
//            Environ env = new Environ(null);
            desenhandoARede(nome);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    

    private void desenhandoARede(String nomeRede) throws Exception {
    	
        Net net = new Net(new Streamer(nomeRede));
        net.compile(); //opcional
        NetPanel netPanel = new NetPanel(net, NodePanel.NODE_STYLE_AUTO_SELECT);
        
        JFrame frame = new JFrame("Desenho da rede "+ nomeRede);
		frame.getContentPane().add(new JScrollPane(netPanel)); //adds the NetPanel to ourself
		frame.setDefaultCloseOperation(JFrame.HIDE_ON_CLOSE);
		frame.setSize(800, 460);
		frame.setVisible(true);
                
    }
    
    public void simularCasosTeste(){
    	int numCases = 200;
		System.out.println("Creating " + numCases + " random cases...");

		try {
//			Environ env = new Environ(null);

			// Read in the net created by the BuildNet.java example program
			Net net = new Net(new Streamer("DistribuicaoHorarios.dne"));
			NodeList nodes = net.getNodes();

			(new File("DistribuicaoHorarios.cas")).delete(); // since it may
																// exist from a
																// previous run
																// and we do not
																// wish to
																// append
			Streamer caseFile = new Streamer("DistribuicaoHorarios.cas");

			net.compile();

			for (int n = 0; n < numCases; n++) {
				net.retractFindings();
				int res = net.generateRandomCase(nodes, 0, 20, null);
				if (res >= 0) {
					net.writeFindings(caseFile, nodes, n, -1.0);
				}
			}

			net.finalize(); // not strictly necessary, but a good habit
			System.out.println("Finalizando a simula��o dos dados");
		} catch (Exception e) {
			e.printStackTrace();
		}
    }
    
    public double inferirProbabilidade(String qtdDisciplinasPegas, String prioridadeDisciplina, String choque, String Jatem) {
    	try {
//			Environ env = new Environ(null);

			// Read in the net created by the BuildNet.java example program
			Net net = new Net(new Streamer("DistribuicaoHorarios.dne"));
			
			Node prioridade 					= (Node) net.getNode("Prioridade");
			Node quantidadeDisciplinasAlocadas 	= (Node) net.getNode("disciplinasAlocadas");
			Node choqueHorario 					= (Node) net.getNode("choqueHorario");
			Node PegouDisciplinaMediaOuAlta =            (Node) net.getNode("PegouDisciplinaMediaOuAlta");
                        Node pegarDisciplina 				= (Node) net.getNode("pegarDisciplina");
                        
			
			net.compile();
			
			double belief = pegarDisciplina.getBelief("sim");
//			System.out.println("A probabilidade de pegar a disciplina e: " + belief);
			
			quantidadeDisciplinasAlocadas.finding().enterState(qtdDisciplinasPegas);
			prioridade.finding().enterState(prioridadeDisciplina);
			choqueHorario.finding().enterState(choque);
                        PegouDisciplinaMediaOuAlta.finding().enterState(Jatem);
			belief = pegarDisciplina.getBelief("sim");
			
			//net.finalize(); // not strictly necessary, but a good habit
			
			return belief;
		} catch (Exception e) {
			e.printStackTrace();
		}
		return -1;
    }
    
    @SuppressWarnings("FinalizeCalledExplicitly")
      public double inferirProbabilidadeAtividade(String horarioDisponivel, String afinidade, String pontuacao, String cargaAlocada) {
    	try {
			Net net = new Net(new Streamer("DistribuicaoAtividades.dne"));
			
			Node cargaHorariaDisponivel = (Node) net.getNode("cargaHorariaDisponivel");
	        Node afinidadeAtividade     = (Node) net.getNode("afinidadeAtividade");
	        Node cargaHorariaAlocada    = (Node) net.getNode("cargaHorariaAlocada");
	        Node pontuacaoProfessor     = (Node) net.getNode("pontuacaoProfessor");
	        Node pegarAtividade			= (Node) net.getNode("pegarAtividade");
			
			net.compile();
			
			cargaHorariaDisponivel.finding().enterState(horarioDisponivel);
			afinidadeAtividade.finding().enterState(afinidade);
			cargaHorariaAlocada.finding().enterState(cargaAlocada);
			pontuacaoProfessor.finding().enterState(pontuacao);
			
			double belief = pegarAtividade.getBelief("pega");
			
			net.finalize(); // not strictly necessary, but a good habit
			
			return belief;
		} catch (Exception e) {
			e.printStackTrace();
		}
		return -1;
    }
}
